package com.adisi.bd;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.adisi.objetos.Domicilio;
import com.adisi.objetos.Telefono;

public class TelefonoDatos {
	
	/**
	 * Obtiene una lista de todos los telefonos de un cliente
	 * 
	 * @return List<Telefono>
	 */
	public ArrayList<Telefono> conseguirTodosLosTelefonos(int idCliente) {
		ArrayList<Telefono> listado = new ArrayList<Telefono>();
		Connection con = null;
		Coneccion coneccion = new Coneccion();
		ResultSet rs = null;
		
		CallableStatement sp = null;
		
		try {
			con = coneccion.conectar();
			
			sp = con.prepareCall("{call sp_Telefono_Select_All_x_Cliente(?)}");
			sp.setInt("id_cliente", idCliente);
			
			sp.execute();
			
			rs = sp.getResultSet();
			
			while (rs.next()) {
			Telefono telefono = new Telefono(
						rs.getString("telefono"),
						new Domicilio(rs.getString("direccion")),
						rs.getString("referencia"),
						idCliente);				

				listado.add(telefono);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				rs.close();
				sp.close();
				con.close();
			} catch (SQLException e) {
				System.out.println("problema al cerrar");
			}
		}
		return listado;
	}	
	
	/**
	 * Graba un Telefono en la Base de Datos
	 * 
	 * @param Telefono
	 * 
	 * @return Boolean
	 */
	public boolean grabarUnTelefono(Telefono telefono) throws Exception
	{
		
		Connection con = null;
		
		Coneccion coneccion = new Coneccion();
		
		CallableStatement sp = null;
		
		boolean ok = true;
		
		try 
		{
			con = coneccion.conectar();
			
			sp = con.prepareCall("{call sp_Telefono_Update(?,?,?,?)}");
			
			sp.setInt("id_cliente", telefono.getIdCliente());
			sp.setString("direccion", telefono.getDomicilio().toString());
			sp.setString("telefono", telefono.getNumero());
			sp.setString("referencia", telefono.getReferencia());
			
			sp.execute();
			
		}
		catch (SQLException e)
		{
			ok = false;
		}
			
		if(!ok)
		{
			try
			{
				sp = con.prepareCall("{call sp_Telefono_Insert(?,?,?,?)}");
					
				sp.setInt("id_cliente", telefono.getIdCliente());
				sp.setString("direccion", telefono.getDomicilio().toString());
				sp.setString("telefono", telefono.getNumero());
				sp.setString("referencia", telefono.getReferencia());
					
				sp.execute();
				
			}
			catch (SQLException e) 
			{
				e.printStackTrace();
				
				ok = false;
			}
			catch (Exception e) 
			{
				throw e;
			}
		}
		
		try
		{
			sp.close();
			con.close();
		} 
		catch (SQLException e) 
		{
			System.out.println("problema al cerrar");
		}
		catch (Exception e) 
		{
			throw e;
		}
		
		return ok ;
	}
	
	
	public void LimpiarTelefonos(int idCliente) throws Exception
	{
		Connection con = null;
		
		Coneccion coneccion = new Coneccion();
		
		CallableStatement sp = null;
		
		try {
			con = coneccion.conectar();
				
			sp = con.prepareCall("{call sp_Telefono_Delete_x_Cliente(?)}");
			
			sp.setInt("id_cliente",idCliente);
			
			sp.execute();  
			
			
		} 
		catch (SQLException e) 
		{
			e.printStackTrace();
		}
		catch (Exception e)
		{
			throw e;
		}
		finally 
		{
			
			try 
			{
				sp.close();
				con.close();
			} 
			catch (SQLException e)
			{
				e.printStackTrace();
			}
			catch (Exception e)
			{
				throw e;
			}
		}
	}

	public Telefono conseguirUnTelefono(String nro) throws Exception
	{
		Telefono telefono = null;
		
		Connection con = null;
		Coneccion coneccion = new Coneccion();
		ResultSet rs = null;
		
		CallableStatement sp = null;
		
		try 
		{
			con = coneccion.conectar();
			
			sp = con.prepareCall("{call sp_Telefono_Select_x_Numero(?)}");
			sp.setString("telefono", nro);
			
			sp.execute();
			
			rs = sp.getResultSet();
			
			while (rs.next()) 
			{
				telefono = new Telefono(
						rs.getString("telefono"),
						new Domicilio(rs.getString("direccion")),
						rs.getString("referencia"),
						rs.getInt("id_cliente"));				

			}
		} 
		catch (SQLException e) 
		{
			e.printStackTrace();
		} 
		catch (Exception e) 
		{
			throw e;
		}
		finally 
		{
			try 
			{
				rs.close();
				sp.close();
				con.close();
			} 
			catch (SQLException e) 
			{
				e.printStackTrace();
			}
			catch (Exception e) 
			{
				throw e;
			}
		}
		
		return telefono;
	}
	
	public boolean borrarUnTelefono(Telefono telefono) throws Exception
	{
		boolean resp = false;
		
		Connection con = null;
		
		Coneccion coneccion = new Coneccion();
		
		CallableStatement sp = null;
		
		try {
			
			con = coneccion.conectar();
								
			sp = con.prepareCall("{call sp_Telefono_Delete(?,?)}");
			
			sp.setInt("id_cliente", telefono.getIdCliente());
			sp.setString("telefono", telefono.getNumero());
			
			sp.execute();
			
		} 
		catch (SQLException e) 
		{
			e.printStackTrace();
		} 
		catch (Exception e) 
		{
			throw e;
		}
		finally 
		{
			try 
			{
				sp.close();
				con.close();
				resp = true;
			} 
			catch (SQLException e) 
			{
				System.out.println("problema al cerrar");
			}
			catch (Exception e) 
			{
				throw e;
			}
		};
		
		return resp;		
	}
	
}
